import * as OSS from 'ali-oss';
import RoleEnum from './roleEnum';


const { region, bucket, accessKeyId, accessKeySecret } = process.env;

const oss = new OSS({
  region,
  bucket,
  accessKeyId: accessKeyId ?? '',
  accessKeySecret: accessKeySecret ?? ''
});
/**
 * 用于把文件传到阿里云的服务器上
 * @param {RoleEnum} role 代表具体存储的种类
 * @param {number} id 代表存储的id
 * @param {*} r 代表存储的文件对象
 */
export async function put(role:RoleEnum, id:number, r) {
  try {

    const fileSuffix = r.filename.replace(/[\s\S]*\./, '.');
    const result = await oss.put(`${role}_${id}${fileSuffix}`, r);
    return { error: false, obj: result };

  } catch (e) {
    return { error: true, obj: e };
  }
}

/**
 * 用于从阿里云OSS中获取文件
 * @param {RoleEnum} role 代表所对应的角色
 * @param {number} id 代表所对应的id
 * @param {string} fileSuffix 代表文件的后缀名,注意要加上'.' 例如:'.xlsx'
 */
export async function get(role:RoleEnum, id:number, fileSuffix:string) {
  const file_name = `${role}_${id}${fileSuffix}`;
  try {
    const result = await oss.getStream(file_name);
    return { result, file_name };

  } catch (e) {
    console.log(e);
    return { error: true, ...e, file_name };

  }

}

/**
 * 用于判断文件是否存在
 * @param {RoleEnum} role 代表所对应的角色
 * @param {number} id 代表所对应的id
 * @param {string} fileSuffix 代表文件的后缀名,注意要加上'.' 例如:'.xlsx'
 * @param {*} options 代表一些选项默认不加就行
 */
export async function isExistObject(role:RoleEnum, id:number, fileSuffix:string, options = {}) {
  const name = `${role}_${id}${fileSuffix}`;

  try {
    await oss.head(name, options);
    return { exist: true, msg: `文件${name}存在,即将开始下载`, name };
  } catch (error) {
    if (error.code === 'NoSuchKey') {
      console.log('文件不存在');
      return { exist: false, msg: `文件${name}不存在,请重新上传后重试`, name };
    }return { exist: false, msg: '未知错误异常,请重试', name };
  }
}
